<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    
    <!--
        深度监听：
            （1）vue中watch默认不监测对象内部值的改变（一层）。
            （2）配置deep:true可以监测对象内部值改变（多层）。
        备注：
            （1）vue自身可以检测对象内部值的改变，但vue提供的watch不可以。
        
        简写：当监视属性只有handler的收可以简写
            写法：直接把监视的数据写作函数（内容为handler方法的内容）
    -->

    <div id="root">
        <h2>今天天气很{{info}}</h2>
        <button @click="changeInfo">点我切换天气</button>
        <hr/>
        <h3>a的值为{{numbers.a}}</h3>
        <button @click="numbers.a++">点我a+1</button>
        <h3>b的值为{{numbers.b}}</h3>
        <button @click="numbers.b++">点我b+1</button>
    </div>

    <script type="text/javascript">
        Vue.config.productionTip = false;//阻止vue在启动的时候生成生产提示

        const vm = new Vue({
            el:"#root",
            data:{
                isHot:true,
                numbers:{
                    a:1,
                    b:2
                }
            },
            computed:{
                info(){
                    return this.isHot?'hot':'cool';
                }
            },
            methods: {
                changeInfo(){
                    this.isHot = !this.isHot;
                }
            },
            watch:{
                //监视info
                info:{
                    //当被监视属性变化时，才调用handler函数
                    handler(newValue,oldValue){
                        console.log("info改变了",newValue,oldValue);
                    }
                },
                
            /*
                //因为a是numbers内的数据，不能直接监听
                //a:{}是错误写法
                //也不可以直接监听：numbers。vue可以监视numbers，但是不监视numbers里面的东西
                //正确方式是监听准确的key(字符串)
                'numbers.a':{        //检测多级结构中的某个属性的变化
                    handler(){
                        console.log("a改变了")
                    }
                }
            */
                

                //检测多聚结构中的所有属性变化
                numbers:{
                    deep:true,
                    handler(){
                        console.log('numbers改变了');
                    }
                }
            }
        })

        //另一中监视方法监视isHot
        vm.$watch("isHot",{
            immediate:true,
            handler(newValue,oldValue){
                console.log("isHot改变了",newValue,oldValue);
            }
        })
   </script>
</body>
</html>